package top.iridescent.test;


import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Slf4j
public class GlobalVar {
    private List<Var> globalVar = new ArrayList<Var>();
    private final static GlobalVar instance = new GlobalVar();

    public static GlobalVar getInstance() {
        return instance;
    }

    private GlobalVar() {
    }

    public List<Var> getGlobalVar() {
        return globalVar;

    }

    public String getVarByName(String name) {
        String tmpName = name;

        if (!tmpName.startsWith("$")) {
            tmpName = "${" + tmpName + "}";
        }
        for (Var aGlobalVar : globalVar) {
            if (aGlobalVar.getVarName().equals(tmpName)) {
                return aGlobalVar.getVarValue();
            }
        }
        return null;
    }

    public void initParamVars(String key, String value) {
        Var var;
        var = new Var("${" + key + "}", value);
        globalVar.add(var);
    }

    public void initBaseVars(String param) {
        String strValue;
        Var var;
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        Calendar calendar = new GregorianCalendar();
        Date beginDate;
        Date endDate;
        long days;

        globalVar.clear();
        if (param == null || param.length() < 6) {
            return;
        }
        if (param.length() == 6) {
            strValue = param.substring(4, 6);
            var = new Var("${mon_number12_cc}", strValue);
            globalVar.add(var);
            strValue = param.substring(2, 6);
            var = new Var("${yymm}", strValue);
            globalVar.add(var);
            strValue = param.substring(0, 4);
            var = new Var("${yyyy}", strValue);
            globalVar.add(var);
            strValue = Integer.parseInt(param.substring(4, 6)) + "";
            var = new Var("${mon_number12}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 4))) % 2) == 0 ? "02" : "01");
            var = new Var("${double_year}", strValue);
            globalVar.add(var);

            strValue = "0" + ((Integer.parseInt(param.substring(0, 4)) % 5) == 0 ? 5 : (Integer.parseInt(param.substring(0, 4)) % 5));
            var = new Var("${five_year}", strValue);
            globalVar.add(var);

            strValue = param;
            var = new Var("${stat_month}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6))) % 2) == 0 ? "02" : "01");
            var = new Var("${double_month}", strValue);
            globalVar.add(var);

            strValue = "0" + ((Integer.parseInt(param.substring(4, 6)) % 3) == 0 ? 3 : (Integer.parseInt(param.substring(4, 6)) % 3));
            var = new Var("${three_month}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6))) % 2) == 0 ? "2" : "1");
            var = new Var("${double_month_d}", strValue);
            globalVar.add(var);


            strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 25 + 1) + "";
            var = new Var("${partitionkey_mon_25}", strValue);
            globalVar.add(var);
            var = new Var("${partitionkey_mon_25_cc}", ("0" + strValue).substring(("0" + strValue).length() - 2));
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 61 + 1) + "";
            var = new Var("${partitionkey_mon_61}", strValue);
            globalVar.add(var);
            var = new Var("${partitionkey_mon_61_cc}", ("0" + strValue).substring(("0" + strValue).length() - 2));
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 3 + 1) + "";
            var = new Var("${partitionkey_mon_3}", strValue);
            globalVar.add(var);
            strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 4 + 1) + "";
            var = new Var("${partitionkey_mon_4}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 7 + 1) + "";
            var = new Var("${partitionkey_mon_7}", strValue);
            globalVar.add(var);

            try {
                strValue = df.format(new Date(df.parse(param.substring(0, 6) + "28").getTime() + (4 * 24 * 3600 * 1000L)));
                strValue = (((Integer.parseInt(strValue.substring(0, 6)) / 100) * 12 + (Integer.parseInt(strValue.substring(0, 6)) % 100) + 1) % 7 + 1) + "";
                var = new Var("${partitionkey_mon_7_next}", strValue);
                globalVar.add(var);
            } catch (ParseException e) {
                e.printStackTrace();
            }


            strValue = (((Integer.parseInt(param.substring(0, 6))) % 2) == 0 ? "1" : "2");
            var = new Var("${pre_double_month_d}", strValue);
            globalVar.add(var);

            try {
                beginDate = df.parse(param + "01");
                strValue = df.format(new Date(beginDate.getTime() - (24 * 3600 * 1000L)));
                var = new Var("${pre_last_date}", strValue);
                globalVar.add(var);

                var = new Var("${pre_last_day_number}", Integer.parseInt(strValue.substring(6, 8)) + "");//上月天数
                globalVar.add(var);

                calendar.setTime(beginDate);
                int count = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
                strValue = (param + count);
                var = new Var("${last_date}", strValue);
                globalVar.add(var);

                var = new Var("${last_day_number}", Integer.parseInt(strValue.substring(6, 8)) + "");//本月天数
                globalVar.add(var);

                strValue = df.format(new Date(df.parse(df.format(beginDate).substring(0, 6) + "01").getTime() - (24 * 3600 * 1000L)));
                var = new Var("${pre_mon_number12_cc}", strValue.substring(4, 6));
                globalVar.add(var);
                var = new Var("${pre_mon_number12}", Integer.parseInt(strValue.substring(4, 6)) + "");
                globalVar.add(var);

                var = new Var("${pre_month}", strValue.substring(0, 6));
                globalVar.add(var);

                var = new Var("${pre_double_year}", (((Integer.parseInt(strValue.substring(0, 4))) % 2) == 0 ? "02" : "01"));
                globalVar.add(var);



                var = new Var("${pre_three_month}", "0" + ((Integer.parseInt(strValue.substring(4, 6)) % 3) == 0 ? 3 : (Integer.parseInt(strValue.substring(4, 6)) % 3)));
                globalVar.add(var);

                var = new Var("${pre_mon_five_year1}", "0" + ((Integer.parseInt(strValue.substring(0, 4)) % 5) == 0 ? 5 : (Integer.parseInt(strValue.substring(0, 4)) % 5)));
                globalVar.add(var);


                //partition_key_25
                strValue = (((Integer.parseInt(strValue.substring(0, 6)) / 100) * 12 + (Integer.parseInt(strValue.substring(0, 6)) % 100) + 1) % 25 + 1) + "";
                var = new Var("${partitionkey_mon_25_pre}", strValue);
                globalVar.add(var);
                var = new Var("${partitionkey_mon_25_cc_pre}", ("0" + strValue).substring(("0" + strValue).length() - 2));
                globalVar.add(var);


                /////next
                strValue = df.format(new Date(beginDate.getTime() + (32 * 24 * 3600 * 1000L))).substring(4, 6);
                var = new Var("${next_mon_number12_cc}", strValue);
                globalVar.add(var);
                strValue = Integer.parseInt(strValue) + "";
                var = new Var("${next_mon_number12}", strValue);
                globalVar.add(var);

                strValue = df.format(new Date(beginDate.getTime() + (32 * 24 * 3600 * 1000L))).substring(0, 4);

                var = new Var("${next_mon_double_year}", (Integer.parseInt(strValue) % 2) == 0 ? "02" : "01");
                globalVar.add(var);
                //next_month
                strValue = df.format(new Date(beginDate.getTime() + (32 * 24 * 3600 * 1000L))).substring(0, 6);

                var = new Var("${next_month}", strValue);
                globalVar.add(var);

                strValue = df.format(new Date(beginDate.getTime() - (24 * 3600 * 1000L))).substring(0, 4);
                strValue = "0" + ((Integer.parseInt(strValue) % 5) == 0 ? 5 : (Integer.parseInt(strValue) % 5));
                var = new Var("${pre_mon_five_year}", strValue);
                globalVar.add(var);


            } catch (ParseException e) {
                e.printStackTrace();
            }


        } else {
            strValue = param.substring(4, 6);
            var = new Var("${mon_number12_cc}", strValue);
            globalVar.add(var);
            strValue = param.substring(2, 6);
            var = new Var("${yymm}", strValue);
            globalVar.add(var);
            strValue = param.substring(4, 8);
            var = new Var("${mmdd}", strValue);
            globalVar.add(var);
            strValue = param.substring(0, 4);
            var = new Var("${yyyy}", strValue);
            globalVar.add(var);
            strValue = Integer.parseInt(param.substring(4, 6)) + "";
            var = new Var("${mon_number12}", strValue);
            globalVar.add(var);


            strValue = "0" + (Integer.parseInt(param.substring(0, 4)) % 5 == 0 ? 5 : Integer.parseInt(param.substring(0, 4)) % 5);
            var = new Var("${five_year}", strValue);
            globalVar.add(var);

            strValue = param.substring(6, 8);
            var = new Var("${day_number_cc}", strValue);
            globalVar.add(var);

            strValue = Integer.parseInt(param.substring(6, 8)) + "";
            var = new Var("${day_number}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 4))) % 2) == 0 ? "02" : "01");
            var = new Var("${double_year}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6))) % 2) == 0 ? "02" : "01");
            var = new Var("${double_month}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6))) % 2) == 0 ? "2" : "1");
            var = new Var("${double_month_d}", strValue);
            globalVar.add(var);

//            strValue = (((Integer.parseInt(param.substring(0, 6))) % 2) == 0 ? "1" : "2");
//            var = new Var("${pre_double_month_d}", strValue);
//            globalVar.add(var);

            strValue = param;
            var = new Var("${stat_date}", strValue);
            globalVar.add(var);

            strValue = param;
            var = new Var("${stat_date2}", strValue.substring(0, 4) + "-" + strValue.substring(4, 6) + "-" + strValue.substring(6, 8));
            globalVar.add(var);

            strValue = param.substring(0, 6);
            var = new Var("${stat_month}", strValue);
            globalVar.add(var);


            strValue = "0" + ((Integer.parseInt(param.substring(4, 6)) % 3) == 0 ? 3 : (Integer.parseInt(param.substring(4, 6)) % 3));
            var = new Var("${three_month}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 3 + 1) + "";
            var = new Var("${partitionkey_mon_3}", strValue);
            globalVar.add(var);

            strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 4 + 1) + "";
            var = new Var("${partitionkey_mon_4}", strValue);
            globalVar.add(var);

            strValue = param;

            try {
                beginDate = df.parse(strValue);
                endDate = df.parse("20000101");
                days = (((beginDate.getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 400) + 1;
                var = new Var("${partitionkey_day_400}", days + "");
                globalVar.add(var);

                var = new Var("${partitionkey_day_400_cc}", ("00" + days).substring(("00" + days).length() - 3));
                globalVar.add(var);

                days = (((beginDate.getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 36) + 1;
                var = new Var("${partitionkey_day_36}", days + "");
                globalVar.add(var);

                var = new Var("${partitionkey_day_36_cc}", ("0" + days).substring(("0" + days).length() - 2));
                globalVar.add(var);

                days = (((beginDate.getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 90) + 1;
                var = new Var("${partitionkey_day_90}", days + "");
                globalVar.add(var);

                var = new Var("${partitionkey_day_90_cc}", ("0" + days).substring(("0" + days).length() - 2));
                globalVar.add(var);

                days = (((beginDate.getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 3) + 1;
                var = new Var("${partitionkey_day_3}", days + "");
                globalVar.add(var);

                days = (((beginDate.getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 2) + 1;
                var = new Var("${partitionkey_day_2}", days + "");
                globalVar.add(var);

                days = (((beginDate.getTime() - endDate.getTime() - 24 * 3600 * 1000L) / (24 * 3600 * 1000)) % 2) + 1;
                var = new Var("${pre_partitionkey_day_2}", days + "");
                globalVar.add(var);

                strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 7 + 1) + "";
                var = new Var("${partitionkey_mon_7}", strValue);
                globalVar.add(var);

                var = new Var("${next_date}", df.format(new Date(beginDate.getTime() + (24 * 3600 * 1000))));
                globalVar.add(var);

                days = (((new Date(beginDate.getTime() + (24 * 3600 * 1000)).getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 36) + 1;
                var = new Var("${next_partitionkey_day_36}", days + "");
                globalVar.add(var);

                var = new Var("${next_partitionkey_day_36_cc}", ("0" + days).substring(("0" + days).length() - 2));
                globalVar.add(var);


                //next_day_number
                var = new Var("${next_day_number}", Integer.parseInt(df.format(new Date(beginDate.getTime() + (24 * 3600 * 1000))).substring(6, 8)) + "");
                globalVar.add(var);
                strValue = df.format(new Date(beginDate.getTime() + (24 * 3600 * 1000))).substring(0, 6);
                var = new Var("${next_stat_month}", strValue);
                globalVar.add(var);
                strValue = df.format(new Date(beginDate.getTime() + (24 * 3600 * 1000))).substring(4, 6);
                var = new Var("${next_mon_number12_cc}", strValue);
                globalVar.add(var);

                strValue = Integer.parseInt(strValue) + "";
                var = new Var("${next_mon_number12}", strValue);
                globalVar.add(var);

                strValue = Integer.parseInt(df.format(new Date(beginDate.getTime() + (24 * 3600 * 1000))).substring(0, 6)) % 2 == 0 ? "2" : "1";
                var = new Var("${next_double_month}", strValue);
                globalVar.add(var);

                strValue = Integer.parseInt(df.format(new Date(beginDate.getTime() + (24 * 3600 * 1000))).substring(0, 4)) % 2 == 0 ? "02" : "01";
                var = new Var("${next_double_year}", strValue);
                globalVar.add(var);

                var = new Var("${next_2_date}", df.format(new Date(beginDate.getTime() + 2 * (24 * 3600 * 1000))));
                globalVar.add(var);

                days = (((beginDate.getTime() - endDate.getTime()) / (24 * 3600 * 1000)) + 5) % 7 + 1;
                var = new Var("${week_num}", days + "");
                globalVar.add(var);

                strValue = df.format(new Date(df.parse(df.format(beginDate).substring(0, 6) + "01").getTime() - (24 * 3600 * 1000L)));
                var = new Var("${pre_mon_number12_cc}", strValue.substring(4, 6));
                globalVar.add(var);
                var = new Var("${pre_mon_number12}", Integer.parseInt(strValue.substring(4, 6)) + "");
                globalVar.add(var);

                var = new Var("${pre_mon_double_year}", (((Integer.parseInt(strValue.substring(0, 4))) % 2) == 0 ? "02" : "01"));
                globalVar.add(var);

                //partitionkey_mon_25_pre
                strValue = (((Integer.parseInt(strValue.substring(0, 6)) / 100) * 12 + (Integer.parseInt(strValue.substring(0, 6)) % 100) + 1) % 25 + 1) + "";
                var = new Var("${partitionkey_mon_25_pre}", strValue);
                globalVar.add(var);
                var = new Var("${partitionkey_mon_25_cc_pre}", ("0" + strValue).substring(("0" + strValue).length() - 2));
                globalVar.add(var);

                strValue = (((Integer.parseInt(param.substring(0, 6)) / 100) * 12 + (Integer.parseInt(param.substring(0, 6)) % 100) + 1) % 61 + 1) + "";
                var = new Var("${partitionkey_mon_61}", strValue);
                globalVar.add(var);
                var = new Var("${partitionkey_mon_61_cc}", ("0" + strValue).substring(("0" + strValue).length() - 2));
                globalVar.add(var);

                //pre last date
                beginDate = df.parse(param.substring(0, 6) + "01");
                strValue = df.format(new Date(beginDate.getTime() - (24 * 3600 * 1000L)));

                var = new Var("${pre_last_date}", strValue);
                globalVar.add(var);

                days = (((df.parse(strValue).getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 400) + 1;
                var = new Var("${pre_mon_last_day_partitionkey_400}", days + "");
                globalVar.add(var);

                var = new Var("${pre_mon_last_day_partitionkey_400_cc}", ("00" + days).substring(("00" + days).length() - 3));
                globalVar.add(var);

                var = new Var("${pre_month}", strValue.substring(0, 6));
                globalVar.add(var);


                var = new Var("${pre_three_month}", "0" + ((Integer.parseInt(strValue.substring(4, 6)) % 3) == 0 ? 3 : (Integer.parseInt(strValue.substring(4, 6)) % 3)));
                globalVar.add(var);

                var = new Var("${pre_mon_five_year}", "0" + ((Integer.parseInt(strValue.substring(0, 4)) % 5) == 0 ? 5 : (Integer.parseInt(strValue.substring(0, 4)) % 5)));
                globalVar.add(var);

                var = new Var("${pre_last_day_number}", Integer.parseInt(strValue.substring(6, 8)) + "");
                globalVar.add(var);

                //last mon day partition key 400
                beginDate = df.parse(param.substring(0, 8));
                calendar.setTime(beginDate);
                calendar.add(Calendar.MONTH, -1);
                df.format(calendar.getTime());
                days = (((calendar.getTime().getTime() - endDate.getTime()) / (24 * 3600 * 1000)) % 400) + 1;
                var = new Var("${last_mon_day_partitionkey_400}", days + "");
                globalVar.add(var);

                var = new Var("${last_mon_day_partitionkey_400_cc}", ("00" + days).substring(("00" + days).length() - 3));
                globalVar.add(var);


                //pre_date
                beginDate = df.parse(param);
                beginDate = new Date(beginDate.getTime() - 24 * 3600 * 1000L);
                var = new Var("${pre_date}", df.format(beginDate));
                globalVar.add(var);


                strValue = (((Integer.parseInt(df.format(beginDate).substring(0, 6))) % 2) == 0 ? "02" : "01");
                var = new Var("${pre_double_month}", strValue);
                globalVar.add(var);

                strValue = (((Integer.parseInt(df.format(beginDate).substring(0, 6))) % 2) == 0 ? "2" : "1");
                var = new Var("${pre_double_month_d}", strValue);
                globalVar.add(var);


                //pre_day_number
                var = new Var("${pre_day_number}", Integer.parseInt((df.format(beginDate)).substring(6, 8)) + "");
                globalVar.add(var);

                //partitionkey_day_124
                days = ((Integer.parseInt(param.substring(4, 6)) % 4 == 0 ? 4 : Integer.parseInt(param.substring(4, 6)) % 4) - 1) * 31 + (Integer.parseInt(param.substring(6, 8)));
                var = new Var("${partitionkey_day_124}", days + "");
                globalVar.add(var);

                //partitionkey_day_124_cc
                var = new Var("${partitionkey_day_124_cc}", ("00" + days).substring(("00" + days).length() - 3));
                globalVar.add(var);

            } catch (ParseException e) {
                e.printStackTrace();
                log.error(e.getMessage(), e,"");
            }

        }
        strValue = df.format(new Date());
        var = new Var("${run_date}", strValue);
        globalVar.add(var);

        var = new Var("${param_date}", param);
        globalVar.add(var);

        df = new SimpleDateFormat("yyyyMMddHHmmss");
        strValue = df.format(new Date());
        var = new Var("${run_time}", strValue);
        globalVar.add(var);
        var = new Var("${run_year}", strValue.substring(0, 4));
        globalVar.add(var);
        var = new Var("${run_mon}", strValue.substring(4, 6));
        globalVar.add(var);
        var = new Var("${run_day}", strValue.substring(6, 8));
        globalVar.add(var);
        var = new Var("${run_hour}", strValue.substring(8, 10));
        globalVar.add(var);
        var = new Var("${run_min}", strValue.substring(10, 12));
        globalVar.add(var);

    }



    public static void main(String[] args) throws Exception {
        GlobalVar.getInstance().initBaseVars("20210909");
        for (int i = 0; i < GlobalVar.getInstance().getGlobalVar().size(); i++) {
            System.out.println(GlobalVar.getInstance().getGlobalVar().get(i).getVarName() + ":" + GlobalVar.getInstance().getGlobalVar().get(i).getVarValue());
        }

    }

}
